﻿using System;
using System.Collections.Generic;
using System.Windows.Forms;
using CRC.Incidencias.Dominio.Controladores;
using CRC.Incidencias.Dominio.Clases;
using System.Threading;

namespace CRC.Incidencias.Presentacion
{
    public partial class SeleccionarConcepto : Form
    {
        //Observer pattern
        private LinkedList<PropertyListener> propertyListeners = new LinkedList<PropertyListener>();
        //Controller pattern
        private ControladorListarConceptos cLC = new ControladorListarConceptos();
        
        private LinkedList<Object[]> data = null;

        /**
         * Constructora 
        **/
        public SeleccionarConcepto()
        {
            InitializeComponent();
            CargarConceptos();
        }

        /**
         * CargarConceptos:
         * Llama a backgroundWorker1.RunWorkerAsync() que es quien realmente
         * hace el trabajo
        **/
        private void CargarConceptos()
        {
            treeViewConceptos.Nodes.Add("Cargando...");
            this.backgroundWorker1.RunWorkerAsync();
        }

        private void CargarConceptosHijos_Rec(TreeNode nodoPadre, LinkedList<Object[]> hijos)
        {
            TreeNode nodoHijo = null;
            foreach (Object[] hijo in hijos) 
            {
                nodoHijo = new TreeNode((String)hijo[0] + " - " + (String)hijo[1]); //codigo concepto
                nodoHijo.Tag = hijo[0]; //descripcion concepto
                LinkedList<Object[]> subHijos = (LinkedList<Object[]>)hijo[2];
                if (subHijos.Count > 0) CargarConceptosHijos_Rec(nodoHijo, subHijos);
                nodoPadre.Nodes.Add(nodoHijo);
            }
        }
       
        private String ObtenerRutaNodo(TreeNode nodo) 
        {
            if (nodo.Parent != null) { return ObtenerRutaNodo(nodo.Parent) + "/" + (String)nodo.Text; }
            else { return nodo.Text; }
        }
        
        /**
         * backgroundWorker1_DoWork:
         * Llama a listar conceptos y deja el resultado n this.data;
        */
        private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            try 
            { 
                this.data = cLC.Listar();
            }
            catch (Exception ex) 
            {
                MessageBox.Show(
                        ex.Message,
                        "Error",
                        MessageBoxButtons.OK,
                        MessageBoxIcon.Error,
                        MessageBoxDefaultButton.Button1
                );
            }
        }

        void backgroundWorker1_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
        {

            TreeNode nodo = null;
            treeViewConceptos.Nodes.RemoveAt(0);
            
            foreach (Object[] conc in data)
            {
                nodo = new TreeNode((String)conc[0] + " - " + (String)conc[1]); //codigo concepto
                nodo.Tag = conc[0]; //descripcion concepto
                CargarConceptosHijos_Rec(nodo, (LinkedList<Object[]>)conc[2]);
                treeViewConceptos.Nodes.Add(nodo);
            }
        } 
        
        //Add subscriber
        public void addPropertyListener(PropertyListener listener) { this.propertyListeners.AddLast(listener); }
        //Remove subscriber
        public void removePropertyListener(PropertyListener listener){this.propertyListeners.Remove(listener);}

    }
}
